<!DOCTYPE html>
<html lang="ja">

<head>
	<meta charset="UTF-8"/>
	<meta name="keywords" content="スクリプトメニュー, スクリプト, スクリプトバンドル, フック, スクリプティング"/>
	<link rel="stylesheet" href="../../Shared/sty/standard.css"/>
	<script defer src="../../Shared/js/toc.js"></script>
	
	<title>MacのCotEditorで特定のイベントでスクリプトを実行する</title>
</head>

<body>

<h1>MacのCotEditorで特定のイベントでスクリプトを実行する</h1>

<p>スクリプトフックは、特定のイベント発生時にスクリプトを起動する機能です。</p>

<p>CotEditorは以下のイベントでのフックをサポートしています:</p>

<ul>
	<li><p><code>document opened</code>: 書類を開いて、テキストが読み込まれた直後</p></li>
	<li><p><code>document saved</code>: 書類を保存して、テキストが書き込まれた直後</p></li>
</ul>

<p>イベントの詳細な仕様については、AppleScript辞書の「CotEditor Event Handler suite」項を参照してください。</p>


<section>
<h2>スクリプトフックに対応する</h2>

<p>フックに対応したスクリプトを作成するには、以下の制約を満たす必要があります:</p>

<ul>
	<li><p>AppleScriptまたはJavaScript for Automation（JXA）で記述</p></li>
	<li><p>スクリプトバンドル形式（.scptd）で保存</p></li>
</ul>

<p>以上に加えて、フックしたいイベントをInfo.plistファイルにて明示し、イベントハンドラを記述する必要があります。</p>
</section>


<section>
<h2>スクリプトバンドルでフックを宣言する</h2>

<p>スクリプトバンドルは、以下のファイル構造を持つパッケージ型のファイルです。</p>

<pre>
HookingScript.scptd
└── Contents
    ├── Info.plist
    └── Resources
        ├── Script Libraries
        │   └── my-fancy-library.scpt
        ├── Scripts
        │   └── main.scpt
        └── description.rtfd
            └── TXT.rtf
</pre>

<p>この形式には、macOSに標準で添付されているスクリプトエディタを用いることにより、簡単に書き出すことができます。</p>

<p>CotEditorのスクリプトフックに対応させるためには、まず、Contents/Info.plistにフックしたいイベントの一覧を記載する必要があります。
plistファイルはプロパティリストと呼ばれ、その内容は以下に示すようなXML形式で記述されたバンドルのメタデータです。</p>

<pre class="source">
<code><span class="type">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
<span class="type">&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;</span>
<span class="tag">&lt;plist</span> <span class="attribute">version=</span><span class="string">&quot;1.0&quot;</span><span class="tag">&gt;</span>
  <span class="tag">&lt;dict&gt;</span>
    <span class="tag">&lt;key&gt;</span>CFBundleIdentifier<span class="tag">&lt;/key&gt;</span>
    <span class="tag">&lt;string&gt;</span>com.coteditor.hooking-script<span class="tag">&lt;/string&gt;</span>
    <span class="tag">&lt;key&gt;</span>CFBundleName<span class="tag">&lt;/key&gt;</span>
    <span class="tag">&lt;string&gt;</span>Hooking Script<span class="tag">&lt;/string&gt;</span>
    <span class="tag">&lt;key&gt;</span>CFBundleShortVersionString<span class="tag">&lt;/key&gt;</span>
    <span class="tag">&lt;string&gt;</span>1.0<span class="tag">&lt;/string&gt;</span>
  <span class="tag">&lt;/dict&gt;</span>
<span class="tag">&lt;/plist&gt;</span>
</code></pre>

<p>フックしたいイベントの一覧は、キー<code>CotEditorHandlers</code>に文字列の配列として記載します。例えば、書類を開いたときと保存したときにスクリプトを自動的に実行したいときは、以下のように記述します:</p>

<pre class="source">
<code><span class="tag">&lt;key&gt;</span>CotEditorHandlers<span class="tag">&lt;/key&gt;</span>
<span class="tag">&lt;array&gt;</span>
  <span class="tag">&lt;string&gt;</span>document opened<span class="tag">&lt;/string&gt;</span>
  <span class="tag">&lt;string&gt;</span>document saved<span class="tag">&lt;/string&gt;</span>
<span class="tag">&lt;/array&gt;</span>
</code></pre>
</section>


<section>
<h2>イベントの処理を記述する</h2>

<p>イベントハンドラは、アプリケーションが発生させたイベントを受信し、処理をするスクリプトを指します。ここでは、ファイルを読み込んだ後と書き込んだ後にダイアログを表示するスクリプトを例に採り上げ、イベントハンドラの記述方法について説明します。</p>

<h3>AppleScript</h3>

<p>AppleScriptでスクリプトを記述する場合、<code>using terms from</code>ブロックと<code>on</code>ブロックを組み合わせることで、ハンドラを作成します。</p>

<pre class="source">
<code><span class="keyword">using terms from</span> <span class="type">application</span> <span class="string">&quot;CotEditor&quot;</span>
    <span class="keyword">on</span> <span class="command">document opened</span> <span class="variable">theDocument</span>
        <span class="command">write to console</span> <span class="string">&quot;Opened &quot;</span> &amp; (<span class="variable">theDocument's</span> <span class="attribute">name</span>)
    <span class="keyword">end</span> <span class="command">document opened</span>

    <span class="keyword">on</span> <span class="command">document saved</span> <span class="variable">theDocument</span>
        <span class="command">write to console</span> <span class="string">&quot;Saved &quot;</span> &amp; (<span class="variable">theDocument's</span> <span class="attribute">name</span>)
    <span class="keyword">end</span> <span class="command">document saved</span>
<span class="keyword">end</span> <span class="keyword">using terms from</span>
</code></pre>

<h3>JavaScript for Automation (JXA)</h3>

<p>JavaScript for Automationでスクリプトを記述する場合、<code>function</code>文を用いてハンドラを作成します。関数はグローバルオブジェクト上で定義する必要があります。</p>

<pre class="source">
<code><span class="variable">CotEditor</span> = <span class="variable">Application</span><span class="p">.</span><span class="command">currentApplication</span><span class="p">()</span>
<span class="variable">CotEditor</span><span class="p">.</span><span class="attribute">includeStandardAdditions</span> = <span class="value">true</span>

<span class="keyword">function</span> <span class="command">documentOpened</span><span class="p">(</span><span class="variable">document</span><span class="p">)</span> <span class="p">{</span>
  <span class="variable">CotEditor</span><span class="p">.</span><span class="command">writeToConsole</span><span class="p">(</span><span class="string">&quot;Opened &quot;</span> + <span class="variable">document</span><span class="p">.</span><span class="command">name</span><span class="p">())</span>
<span class="p">}</span>

<span class="keyword">function</span> <span class="command">documentSaved</span><span class="p">(</span><span class="variable">document</span><span class="p">)</span> <span class="p">{</span>
  <span class="variable">CotEditor</span><span class="p">.</span><span class="command">writeToConsole</span><span class="p">(</span><span class="string">&quot;Saved &quot;</span> + <span class="variable">document</span><span class="p">.</span><span class="command">name</span><span class="p">())</span>
<span class="p">}</span>
</code></pre>
</section>


<section id="cf">
<h2>関連項目</h2>
<ul>
	<li><a href="script_overview.html">MacのCotEditorの作業をスクリプトで自動化する</a></li>
	<li><a href="script_menu.html">MacのCotEditorでスクリプトメニューをカスタマイズする</a></li>
	<li><a href="script_osascript.html">MacのCotEditorでAppleScriptを使って作業を自動化する</a></li>
</ul>
</section>

</body>
</html>
